# -*- coding: utf-8 -*-
import sys

estado=0
palabra=''
tabla=[]
aritmeticos = ['+','-','*','/','%']
mas=['+']
menos=['-']
por=['*']
division=['/']
modulo=['%']
logicos = ['&&','||','!=','!']
y=['&&']
o=['||']
negacion=['!']
diferente=['!=']
relacionales = ['>','<','=','>=','<=']
mayor=['>']
menor=['<']
igual=['=']
mayorigual=['>=']
menorigual=['<=']
asignacion = ['==','+=','-=','*=','/=']
asigna=['==']
masigual=['+=']
menosigual=['-=']
porigual=['*=']
divisionigual=['/=']
incremento = ['++','--']
masmas=['++']
menosmenos=['--']
numLineas = 1

def Cero(c):
	global estado
	global palabra
	if ismas(c):
		estado = 1
		palabra += c

	elif ismenos(c):
		estado = 2
		palabra += c

	elif ispor(c):
		estado = 3
		palabra += c

	elif isdivision(c):
		estado = 4
		palabra += c

	elif ismodulo(c):
		estado = 0
		palabra = c
	
	elif isnegacion(c):
		estado = 5
		palabra += c

	elif isy(c):
		estado = 6
		palabra += c
	
	elif iso(c):
		estado = 7
		palabra += c

	elif isigual(c):
		estado = 8
		palabra += c

	elif ismayor(c):
		estado = 9
		palabra += c

	elif ismenor(c):
		estado = 10
		palabra += c

	else:
		EdoFinal()
		Once(c)

def Uno(c):
	global estado
	global palabra
	if ismas(c):
		estado=1
		palabra += c
	
	elif isigual(c):
		estado=1
		palabra += c

	else:
		EdoFinal()
		Once(c)

def Dos(c):
	global estado
	global palabra
	if ismenos(c):
		estado=2
		palabra += c
	
	elif isigual(c):
		estado=2
		palabra += c

	else:
		EdoFinal()
		Once(c)

def Tres(c):
	global estado
	global palabra
	if isigual(c):
		estado=3
		palabra += c
	else:
		EdoFinal()
		Once(c)

def Cuatro(c):
	global estado
	global palabra
	if isigual(c):
		estado=4
		palabra += c
	else:
		EdoFinal()
		Once(c)

def Cinco(c):
	global estado
	global palabra
	if isigual(c):
		estado=5
		palabra += c
	else:
		EdoFinal()
		Once(c)

def Seis(c):
	global estado
	global palabra
	if isy(c):
		estado=6
		palabra += c

def Siete(c):
	global estado
	global palabra
	if iso(c):
		estado=7
		palabra += c

def Ocho(c):
	global estado
	global palabra
	if isigual(c):
		estado=8
		palabra += c
	else:
		EdoFinal()
		Once(c)

def Nueve(c):
	global estado
	global palabra
	if isigual(c):
		estado=9
		palabra +=c
	else:
		EdoFinal()
		Once(c)

def Diez(c):
	global estado
	global palabra
	if isigual(c):
		estado=10
		palabra +=c
	else:
		EdoFinal()
		Once(c)	

def Once(c):
	print "...De esto se encarga el siguiente autómata: " + c
	palabra=''


def EdoFinal():
	global estado
	global palabra
	global reservadas
	if palabra in aritmeticos:
		print 'aritmeticos => ',
		print palabra
		arit = tipo_id(palabra)
		tabla.append(["OPERADOR ARITMÉTICO",palabra,arit])
	elif palabra in incremento:
		print 'incremento => ',
		print palabra
		incre = tipo_id1(palabra)
		tabla.append(["INCREMENTO",palabra,incre])
	elif palabra in asignacion:
		print 'asignacion => ',
		print palabra
		asig = tipo_id2(palabra)
		tabla.append(["ASIGNACIÓN",palabra,asig])
	elif palabra in logicos:
		print 'logicos => ',
		print palabra
		logic = tipo_id3(palabra)
		tabla.append(["OPERADOR LÓGICO",palabra,logic])
	elif palabra in relacionales:
		print 'relacionales => ',
		print palabra
		relacional = tipo_id4(palabra)
		tabla.append(["OPERADOR RELACIONAL",palabra,relacional])
	estado=0
	palabra=''

def tipo_id(arit):
	if arit in mas:
		return "SUMA"
	if arit in menos:
		return "RESTA"
	if arit in por:
		return "MULTIPLICACIÓN"
	if arit in division:
		return "DIVISIÓN"
	if arit in modulo:
		return "MÓDULO"

def tipo_id1(incre):
	if incre in masmas:
		return "INCREMENTO-POSITIVO"
	if incre in menosmenos:
		return "INCREMENTO-NEGATIVO"

def tipo_id2(asig):
	if asig in asigna:
		return "ASIGNACION"
	if asig in masigual:
		return "SUMA-ASIGNACIÓN"
	if asig in menosigual:
		return "MENOS-ASIGNACIÓN"
	if asig in porigual:
		return "MULTIPLICACIÓN-ASIGNACIÓN"
	if asig in divisionigual:
		return "DIVISIÓN-ASIGNACIÓN" 

def tipo_id3(logic):
	if logic in y:
		return "Y"
	if logic in o:
		return "O"
	if logic in negacion:
		return "NEGACIÓN"
	if logic in diferente:
		return "DIFERENTE"

def tipo_id4(relac):
	if relac in mayor:
		return "MAYOR"
	if relac in menor:
		return "MENOR"
	if relac in igual:
		return "IGUAL"
	if relac in mayorigual:
		return "MAYOR-IGUAL"
	if relac in menorigual:
		return "MENOR-IGUAL"

def ismas(c):
	if c=='+':
		return True
	else:
		return False

def isigual(c):
	if c=='=':
		return True
	else:
		return False

def ismenos(c):
	if c=='-':
		return True
	else:
		return False

def ispor(c):
	if c=='*':
		return True
	else:
		return False

def isdivision(c):
	if c=='/':
		return True
	else:
		return False

def ismodulo(c):
	if c=='%':
		return True
	else:
		return False

def isnegacion(c):
	if c=='!':
		return True
	else:
		return False

def isy(c):
	if c=='&':
		return True
	else:
		return False

def iso(c):
	if c=='|':
		return True
	else:
		return False

def ismayor(c):
	if c=='>':
		return True
	else:
		return False

def ismenor(c):
	if c=='<':
		return True
	else:
		return False

def main():

	global palabra
	global tabla
	global estado
	global numLineas

	archivo_entrada = open(sys.argv[1])
	tabla_simbolos = open(sys.argv[2],'w')
	archivo_errores = open(sys.argv[3],'w')

	Switch={
		0:Cero,
		1:Uno,
		2:Dos,
		3:Tres,
		4:Cuatro,
		5:Cinco,
		6:Seis,
		7:Siete,
		8:Ocho,
		9:Nueve,
		10:Diez,
		11:Once,
	}

	while 1:
	    char = archivo_entrada.read(1)          # read by character
	    if not char: 
	    	break
	    ####codigo####
	    if char==' ' or char=='\r' or char=='\n':
	    	#print "ERR: " + char
	    	if palabra!='':
	    		EdoFinal()
	    		print "EDO FINAL"
	    	palabra=''
	    	estado=0
	    	if char=='\n':
	    		numLineas += 1
	    	continue
	    else:
	    	print 'ch: ' + char
	    	print 'edo: ' + str(estado)
	    	Switch[estado](char)
    	####codigo####
    	
    	###########################################

	for p in tabla:
		tabla_simbolos.write(p[0] + '\t' + p[1] + '\t' + p[2] + '\r\n')

	archivo_entrada.close()
	tabla_simbolos.close()
	archivo_errores.close()

	print "numLineas: " + str(numLineas)

if __name__=="__main__":
	main()
